home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctjjl86.arc / ANIMATE.ARC / STANDXOR.ASM < prev    next >
Assembly Source File  |  1986-04-16  |  2KB  |  75 lines

  1. ; *** Listing 1 ***
  2. ;
  3. ;Standard XOR graphics driver for putting rectangular images into
  4. ; the Color/Graphics Adapter's medium-resolution memory map.
  5. ;
  6. ; Note: all registers preserved.
  7. ;
  8. one    segment para public 'CODE'
  9.     assume    cs:one,ds:one,es:nothing
  10.     public    form_driver
  11. ;
  12. display_width    db    80
  13. line_counter    db    ?
  14. ;
  15. form_driver proc near
  16.     push    ax    ;preserve all general registers
  17.     push    bx
  18.     push    cx
  19.     push    dx
  20.     push    si
  21.     push    di
  22. ;
  23.     shr    bl,1     ;are we starting in top or bottom 8K bank?
  24.              ; also divides row by 2 to compensate for
  25.              ; odd/even bank arrangement
  26.     jc    starts_in_second_8k_bank
  27.     sub    di,di     ;even lines start in first 8K bank
  28.     jmp    short calculate_row_offset
  29. starts_in_second_8k_bank:
  30.     mov    di,2000h ;odd lines start in second 8K bank
  31. calculate_row_offset:
  32.     mov    al,[display_width]
  33.     mul    bl     ;find the offset of top line of image
  34.     add    di,ax     ; relative to start of 8K bank
  35.     add    di,cx     ;ES:DI now points to byte at which to put
  36.              ; the image's upper left corner
  37.     mov    al,[si]  ;get the height of the image
  38.     inc    si     ;point to form width
  39.     mov    [line_counter],al  ;store count of lines to draw
  40.     mov    dl,[si]  ;get the width of the image in bytes
  41.     sub    dh,dh     ;make 16 bit value
  42.     inc    si     ;point to start of form bytes
  43. ;
  44. next_line:
  45.     mov    cx,dx       ;set the number of bytes/line for form
  46.     push    di       ;preserve offset of start of line
  47. next_column:
  48.     mov    al,[si]    ;get this image byte
  49.     inc    si       ;point to the following image byte
  50.     xor    es:[di],al ;exclusive-OR it into screen memory
  51.     inc    di       ;point to next screen memory position
  52.     loop    next_column ;loop for next byte on line
  53.     pop    di       ;get back offset of start of this line
  54.     cmp    di,2000h       ;which 8K bank is next line in?
  55.     jb    next_line_in_second_8k
  56.     sub    di,2000h-50h   ;point start of next line in 1st 8K
  57.     jmp    short count_down_lines
  58. next_line_in_second_8k:
  59.     add    di,2000h       ;point start of next line in 2nd 8K
  60. count_down_lines:
  61.     dec    [line_counter] ;count down number of lines
  62.     jne    next_line      ;jmp if any lines left
  63.                    ;if not, restore registers and
  64.     pop    di           ; return to calling program
  65.     pop    si
  66.     pop    dx
  67.     pop    cx
  68.     pop    bx
  69.     pop    ax
  70.     ret
  71. ;
  72. form_driver endp
  73. one    ends
  74.     end
  75.